package top.ytazwc.improve.utils;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author 花木凋零成兰
 * @title ClassLoaderUtils
 * @date 2024/4/28 17:21
 * @package top.ytazwc.improve.utils
 * @description 反射方法 参数处理工具类
 */
public class ClassLoaderUtils {
    /**
     * 根据传入的对象数组确定每个对象的运行时类，并返回一个包含这些类的数组。
     *
     * @param args 一个包含任意类型对象的数组。
     * @return 返回一个新的Class<?>数组，包含了args中每个对象的Class对象。
     */
    public static Class<?>[] getClazzByArgs(Object[] args) {
        // 创建一个新的Class数组，其长度与传入的args数组相同。
        Class<?>[] parameterTypes = new Class[args.length];
        // 遍历args数组的每个元素。
        for (int i = 0; i < args.length; i++) {
            // 如果当前元素是ArrayList的实例，则将其类型记录为List类。
            if (args[i] instanceof ArrayList) {
                parameterTypes[i] = List.class;
                continue;
            }
            // 如果当前元素是LinkedList的实例，同样将其类型记录为List类。
            if (args[i] instanceof LinkedList) {
                parameterTypes[i] = List.class;
                continue;
            }
            // 如果当前元素是HashMap的实例，则将其类型记录为Map类。
            if (args[i] instanceof HashMap) {
                parameterTypes[i] = Map.class;
                continue;
            }
            // 如果当前元素是Long的实例，将其类型记录为原始类型long。
            if (args[i] instanceof Long) {
                parameterTypes[i] = long.class;
                continue;
            }
            // 如果当前元素是Double的实例，将其类型记录为原始类型double。
            if (args[i] instanceof Double) {
                parameterTypes[i] = double.class;
                continue;
            }
            // 如果当前元素是TimeUnit的实例，则将其类型记录为TimeUnit类。
            if (args[i] instanceof TimeUnit) {
                parameterTypes[i] = TimeUnit.class;
                continue;
            }
            // 如果当前元素不是上述任何一种类型，就使用其实际的类。
            parameterTypes[i] = args[i].getClass();
        }
        // 返回包含所有参数类型信息的数组。
        return parameterTypes;
    }
}
